package com.lgc.javathread.locktest.reentrantLockTest;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockTest {

    private Lock lock = new ReentrantLock();

    public static void main(String[] args){
        final ReentrantLockTest test=new ReentrantLockTest();

        new Thread(){
            @Override
            public void run() {
                test.insert(Thread.currentThread());
                //test.insert2(Thread.currentThread());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                test.insert(Thread.currentThread());
                //test.insert2(Thread.currentThread());
            }
        }.start();
    }

    public void insert(Thread thread){
        //Lock()的使用方法.
        //如果锁已被其他线程获取，则进行等待。
        lock.lock();
        try{
            System.out.println(thread.getName()+"得到了锁");

            Thread.sleep(1000);
        }
        catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(thread.getName()+"释放了锁");
            lock.unlock();
        }
    }

    public void insert2(Thread thread){
        //tryLock()的使用方法
        //tryLock()方法是有返回值的，它表示用来尝试获取锁，如果获取成功，则返回true，
        // 如果获取失败（即锁已被其他线程获取），则返回false，
        // 也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
        if(lock.tryLock()){
            try{
                System.out.println(thread.getName()+"得到了锁");

                Thread.sleep(1000);
            }
            catch (Exception e){
                e.printStackTrace();
            }finally {
                System.out.println(thread.getName()+"释放了锁");
                lock.unlock();
            }
        }else {
            System.out.println(thread.getName()+"获取锁失败");
        }
    }

    public void insert3(Thread thread) throws InterruptedException {
        //tryLock()的使用方法  如果2秒内获取不到锁对象，那就不再等待
        if(lock.tryLock(2,TimeUnit.SECONDS)){
            try{
                System.out.println(thread.getName()+"得到了锁");

                Thread.sleep(1000);
            }
            catch (Exception e){
                e.printStackTrace();
            }finally {
                System.out.println(thread.getName()+"释放了锁");
                lock.unlock();
            }
        }else {
            System.out.println(thread.getName()+"获取锁失败");
        }
    }
}
